package com.biao.java8.demo;

import com.biao.java8.demo.pojo.Employee;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class TestStreamAPI3 {
    public static void main(String[] args) {
        List<Employee> emps = Arrays.asList(
                new Employee("李四", 59, 6666.66),
                new Employee("张三", 18, 9999.99),
                new Employee("王五", 28, 3333.33),
                new Employee("赵六", 8, 7777.77),
                new Employee("赵六", 8, 7777.77),
                new Employee("赵六", 8, 7777.77),
                new Employee("田七", 38, 5555.55),
                new Employee("田七", 38, 5555.55)
        );
        /*
            规约
            reduce(T identity, BinaryOperator) / reduce(BinaryOperator)  将流中的元素反复结合成一个值
         */
        List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        Integer integer = integerList.stream()
                .reduce(0, Integer::sum);    // 第一个参数0,是起始值,     求和
        System.out.println(integer);    // integerList 集合中所有元素的和

        Optional<Double> optional = emps.stream()
                .map(Employee::getSalary)   // 过滤每个元素的 salary，是Double类型
                .reduce(Double::sum);       // 如果不给起始值,返回结果是Optional
        // optional 如果不为空就打印
        optional.ifPresent(System.out::println);


        /*
            收集
            collect     把流转为其他形式,接收一个Collector接口实现,给流中元素做汇总的方法
                    下面有很多的方法:
                        .toList()       返回集合
                        .toSet()        返回去重后的set集合
                        .counting()     返回总数
                        .averagingDouble(参数)    返回平均值
                        .summingDouble(参数)      返回总和
                        .maxBy(表达式)     返回最大的值
                        .groupingBy(参数)     分组返回map
                        .partitioningBy(表达式)    分区
                        等等很多方法
         */
        List<String> collect = emps.stream()
                .map(Employee::getName)         // 准备收集所有姓名
                .collect(Collectors.toList());      // 转成集合
        System.out.println(collect);
    }
}
